home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #1 / Ham Radio 2000.iso / ham2000 / tcp_ip / tnos / tnos100s / rdate.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-01-08  |  3.0 KB  |  148 lines

  1. /* Internet rdate client
  2.  * Author: Brian Teravskis, WD0EFL
  3.  * Date: 03/30/92
  4.  *
  5.  * Based on RFC868 Time Protocol
  6.  *
  7.  * Added local hour offset - Doug Crompton 10/28/92
  8.  * and subcommand menu for possible future commands
  9.  */
  10. #include <stdio.h>
  11. #include <string.h>
  12. #include "global.h"
  13. #include "mbuf.h"
  14. #include "socket.h"
  15. #include "session.h"
  16. #include "proc.h"
  17. #include "netuser.h"
  18. #include "commands.h"
  19. #include "tty.h"
  20. #include "timer.h"
  21. #include <time.h>
  22. #include "cmdparse.h"
  23.  
  24. #define IPPORT_TIME 37
  25. #define DIFFTIME 2208988800
  26. #define RDATETIMEOUT 30
  27.  
  28. static void rdate_timeout();
  29. static int rdate_offset=0;
  30.  
  31. static int dordateserver __ARGS((int argc,char *argv[],void *p));
  32. static int dordateoff __ARGS((int argc,char *argv[],void *p));
  33.  
  34. static struct cmds rdatecmds[] = {
  35.     "server", dordateserver, 512, 2,
  36.     "rdate server <address>",
  37.  
  38.     "offset", dordateoff, 0, 0,
  39.     NULLCHAR,
  40.  
  41.     NULLCHAR,
  42. };
  43.  
  44. int
  45. dordate(argc,argv,p)
  46. int argc;
  47. char *argv[];
  48. void *p;
  49. {
  50.     return subcmd(rdatecmds,argc,argv,p);
  51. }
  52.  
  53. static int
  54. dordateserver(argc,argv,p)
  55. int argc;
  56. char *argv[];
  57. void *p;
  58. {
  59.     struct sockaddr_in sock;
  60.     int s,i;
  61.     struct mbuf *bp;
  62.     struct timer *t;
  63.     time_t rtime, raw_time;
  64.     char i_state;
  65.  
  66.     if((sock.sin_addr.s_addr = resolve(argv[1])) == 0){
  67.         log(-1,"RDATE:Host %s unknown",argv[1]);
  68.         return 1;
  69.     }
  70.     sock.sin_family = AF_INET;
  71.     sock.sin_port = IPPORT_TIME;
  72.  
  73.     /* Open connection to time server */
  74.     if((s = socket(AF_INET,SOCK_STREAM,0)) == -1) {
  75.         log(-1,"RDATE:Can't create socket");
  76.         return 1;
  77.     }
  78.     sockmode(s,SOCK_BINARY);
  79.  
  80.     /* Set timeout timer */
  81.     t = (struct timer *)callocw(1, sizeof(struct timer));
  82.     t->func = rdate_timeout;
  83.     t->arg = (void *) &s;
  84.     set_timer(t,RDATETIMEOUT*1000L);
  85.     start_timer(t);
  86.  
  87.     /* Connect to time server */
  88.     if(connect(s,(char *)&sock,sizeof(sock)) == -1){
  89.         /* Connect failed */
  90.         stop_timer(t);
  91.         free(t);
  92.         log(s,"RDATE: Connect failed");
  93.         close_s(s);
  94.         return 1;
  95.     }
  96.     /* Successful connect, stop timout timer */
  97.     stop_timer(t);
  98.     free(t);
  99.     /* Get time info sent by server */
  100.     recv_mbuf(s,&bp,0,NULLCHAR,(int *)0);
  101.     rtime = (time_t)pull32(&bp);
  102.     /* Convert 1900 start date to 1970 start date */
  103.     rtime -= DIFFTIME;
  104.     raw_time=rtime;
  105.     rtime += (rdate_offset*3600L);
  106.     /* Set the system time */
  107.     i_state=dirps();
  108.     stime(&rtime);
  109.     restore(i_state);
  110.     log(s,"RDATE:Clock set to %s from %s",ctime(&rtime),argv[1]);
  111.     printf("\nTime received from %s - %s",argv[1],ctime(&raw_time));
  112.     printf("System time set to %s\n",ctime(&rtime));
  113.     free_q(&bp);
  114.     close_s(s);
  115.     return 0;
  116. } /* dordate */
  117.  
  118. /*
  119.  * Close socket after timeout on connect
  120.  */
  121. static void
  122. rdate_timeout(arg)
  123.  
  124. void *arg;
  125. {
  126.     int     *s;
  127.  
  128.     s = (int *)arg;
  129.     close_s(*s);
  130. } /* rdate_timeout */
  131.  
  132. /* Set time offset */
  133. static int
  134. dordateoff(argc, argv,p)
  135. int argc;
  136. char *argv[];
  137. void *p;
  138. {
  139.     if(argc < 2) {
  140.         tprintf("Usage: 'rdate offset <+-hours>' - Current Offset %d Hours\n",rdate_offset);
  141.         return 0 ;
  142.     }
  143.     
  144.     rdate_offset = atoi(argv[1]);
  145.     return 0;
  146. }
  147.  
  148.